#include <stdio.h>

int a = 0;//存放在静态区
static int b = 1;//存放在静态区

void test(int a)
{
    int d = 1;
    int e = 2;
}

int main()
{
    static int c = 0;//存放在静态区
    int d = 3;//栈区
    int e = 4;//栈区

    printf("%p, %p, %p, %p, %p\n", &a, &b, &c, &d, &e);
    test(d);//test函数内部的自动变量开始出现在内存了,它们都在栈里面
    return 0;
}
// 内存布局
//
// 1.代码区code，程序被操作系统加载到内存的时候，所有的可以执行的代码都加载到代码区
// 也叫代码段，这块内存是不可以在运行期间修改的.
//
// 代码区中所有的内容在程序加载到内存的时候就确定了，运行期间不可以修改，只可以执行
//
// 2.静态区
// 静态区是程序加载到内存的时候就确定了，程序退出的时候从内存消失。所有的全局变量和静态变量在程序运行期间都占用内存。
// 所有的全局变量以及程序中的静态变量都存储到静态区
//
// 3.栈区stack
// 是一种先进后出的内存结构，
// 所有的自动变量，函数的形参，函数的返回值
// 都是由编译器自动放出栈中，当一个自动变量超出其作用域时，自动从栈中弹出
//
// 4.堆区heap
// 堆和栈一样，也是一种在程序运行过程中可以随时修改的内存区域
// 但没有栈那样先进后出的顺序
// 堆是要给大容器，它的容量要远远大于栈，
// 但是c语言中，堆内存空间的申请和释放需要手动通过代码来完成
